/*
 * @Description: 前瞻
 * @Author: dh
 * @Date: 2022-05-19 10:55:14
 * @LastEditors: dh
 * @LastEditTime: 2023-11-13 16:25:03
 */
// 01 (?=p) === 符合p子模式前面的那个位置。换句话说是，有一个位置，紧跟其后需要满足p子模式。也有一个学名叫正向先行断言。
'xxx_love_study_1.mp4'.replace(/(?=xxx)/g, '❤️') // ❤️xxx_love_study_1.mp4

// 02 (?!p) === (?=p)反过来的意思，可以理解为(?=p)匹配到的位置之外的位置都是属于(?!p)的，它也有一个学名叫负向先行断言。
'xxx_love_xxx_1.mp4'.replace(/(?!xxx)/g, '❤️') // x❤️x❤️x❤️_❤️l❤️o❤️v❤️e❤️_x❤️x❤️x❤️_❤️1❤️.❤️m❤️p❤️4❤️

// 03 (?<=p) === 符合p子模式后面(注意(?=p)表示的是前面)的那个位置。换句话说是，有一个位置，其前面的部分需要满足p子模式。
'xxx_love_study_1.mp4'.replace(/(?<=xxx)/g, '❤️') //xxx❤️_love_study_1.mp4

// 04 (?<!p) === (?<=p)反过来的意思，可以理解为(?<=p)匹配到的位置之外的位置都是属于(?<!p)的，
'xxx_love_study_1.mp4'.replace(/(?<!xxx)/g, '❤️') // ❤️x❤️x❤️x_❤️l❤️o❤️v❤️e❤️_❤️s❤️t❤️u❤️d❤️y❤️_❤️1❤️.❤️m❤️p❤️4❤️

// 案例

/* 例 1：数字的千分位分割法 */
'123456789'.replace(/(?!^)(?=(\d{3})+$)/g, '_')

'1000000'.replace(/(\d)(?=(\d\d\d)+(?!\d))/g, '$1_')
;(10000000000.00112).toLocaleString() === '10,000,000,000.001' // true

/* 例 2：手机号3-4-4分割 */
// 从后验证
'18379836654'.replace(/(?=(\d{4})+$)/g, '_')
// 密码必须包含 大小写字母，数字，特殊字符 s@,-. 且长度6-12
;/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[s@,-.])[a-zA-Z\ds@,-.]{6,12}$/.test('aaaaaaA1,')
